#include <iostream>
#include <queue>
#include <stack>
#include <list>
#include <assert.h>

using namespace std;

#include "queue.h"
#include "stack.h"
#include "priority_queue.h"

void test_stack()
{
    stack<int, vector<int>> st1(vector<int>({1,2,3,4,5}));

    while (!st1.empty())
    {
        cout << st1.top() << ' ';
        st1.pop();
    }
    cout << endl;

    stack<int> st2;
    st2.push(1);
    st2.push(2);
    st2.push(3);
    st2.push(4);
    st2.push(5);
    st2.push(6);
    st2.push(7);
    st2.push(8);
    st2.push(9);
    cout << st2.size() << endl;

    while (!st2.empty())
    {
        cout << st2.top() << ' ';
        st2.pop();
    }
    cout << endl;
}

void test_my_stack()
{
    my_stack::stack<int> st1;
    st1.push(1);
    st1.push(2);
    st1.push(3);
    st1.push(4);
    st1.push(5);
    st1.push(6);
    st1.push(7);
    cout << st1.size() << endl;

    while (!st1.empty())
    {
        cout << st1.top() << ' ';
        st1.pop();
    }
    cout << endl;



    ////list<char> s(10, 1);
    //stack<int, list<char>> st2(list<char>(10, 'a'));
    //while (!st2.empty())
    //{
    //    cout << st2.top() << ' ';
    //    st2.pop();
    //}
    //cout << endl;
}

void test_queue()
{
    queue<int> q1;
    q1.push(1);
    q1.push(2);
    q1.push(3);
    q1.push(4);
    q1.push(5);
    q1.push(6);
    while (!q1.empty())
    {
        cout << q1.front() << ' ' << q1.back() << endl;
        q1.pop();
    }
    cout << endl;

    queue<int, list<int>> q2(list<int>({ 1,2,3,4,5,6,7,8,9,10 }));
    
    while (!q2.empty())
    {
        cout << q2.front() << ' ';
        q2.pop();
    }
    cout << endl;

}

void test_my_queue()
{
    my_queue::queue<int> q1;
    q1.push(1);
    q1.push(2);
    q1.push(3);
    q1.push(4);
    q1.push(5);
    q1.push(6);
    q1.push(7);
    q1.push(8);

    cout << q1.size() << endl;

    while (!q1.empty())
    {
        cout << q1.front() << ' ';
        q1.pop();
    }
    cout << endl;

}

void test_priority_queue()
{
    vector<int> v1({ 1,2,3,4,5,6,7,8,9 });
    priority_queue<int> q1(v1.begin(), v1.end());
    
    while (!q1.empty())
    {
        cout << q1.top() << ' ';
        q1.pop();
    }
    cout << endl;
}

void test_my_p_queue()
{
    vector<int> v1({ 4,67,2,7,8,22,9,44,8,2,88,13,53 });
    my_pri_queue::priority_queue<int> q1(v1.begin(), v1.end());
        
    my_pri_queue::priority_queue<int> q2;//(v1.begin(), v1.end());
    q2 = q1;

    while (!q1.empty())
    {
        cout << q1.top() << ' ';
        q1.pop();
    }
    cout << endl;

    q2.push(9999);
    while (!q2.empty())
    {
        cout << q2.top() << ' ';
        q2.pop();
    }
    cout << endl;
}

int main()
{
    test_stack();
	test_my_stack();
    cout << endl;
    test_queue();
    test_my_queue();
    cout << endl;
    test_priority_queue();
    test_my_p_queue();
    cout << endl;

    return 0;
}
